package src.edu.uniquindio.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import src.edu.uniquindio.mundo.Estudiante;
import src.edu.uniquindio.mundo.Evaluacion;

public class DaoEvaluacion {

	private Connection conexion;

	public DaoEvaluacion(Connection conexion) {
		super();
		this.conexion = conexion;
	}

	public void crearEvaluacion(Evaluacion evaluacion) {

		try {
			PreparedStatement pstmt = conexion
					.prepareStatement("insert into Evaluacion "
							+ "(nombreJuego,categoria,rango,puntaje,fecha,estudiante_Codigo) "
							+ "values(?,?,?,?,?,?)");

			pstmt.setString(1, evaluacion.getNombreJuego());
			pstmt.setString(2, evaluacion.getCategoria());
			pstmt.setInt(3, evaluacion.getRango());
			pstmt.setInt(4, evaluacion.getPuntaje());
			pstmt.setString(5, evaluacion.getFecha());
			pstmt.setString(6, evaluacion.getEstudiante().getCodigo());
			pstmt.executeUpdate();

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	// solo categoria
	public List<Evaluacion> evaluacionesCategoria(String categoria,
			String docente) {
		List<Evaluacion> evaluaciones = new ArrayList<Evaluacion>();
		try {

			PreparedStatement pstmt = null;
			if (categoria.equals("Todas")) {
				pstmt = conexion
						.prepareStatement("select estudiante_Codigo,categoria,rango,puntaje,fecha from Evaluacion where estudiante_Codigo IN ( select codigo from Estudiante where docente_Cedula=? ) ");
				pstmt.setString(1, docente);
			} else {
				pstmt = conexion
						.prepareStatement("select estudiante_Codigo,categoria,rango,puntaje,fecha from Evaluacion where categoria=? AND estudiante_Codigo IN ( select codigo from Estudiante where docente_Cedula=? ) ");
				pstmt.setString(1, categoria);
				pstmt.setString(2, docente);
			}

			ResultSet res = pstmt.executeQuery();
			while (res.next()) {
				String codigo = res.getString(1);
				int rango = res.getInt(3);
				categoria = res.getString(2);
				int puntaje = res.getInt(4);
				String fecha = res.getString(5);
				Estudiante estudiante = new Estudiante(codigo, rango, "", "",
						null, "", "","");
				Evaluacion evaluacion = new Evaluacion("", categoria, fecha,
						rango, puntaje, estudiante);
				evaluaciones.add(evaluacion);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return evaluaciones;
	}

	// todas las opciones llenas
	public List<Evaluacion> evaluacionesCategoriaFechaCodigo(String categoria,
			String fecha, String nombre, String docente,int edad) {
		
		List<Evaluacion> evaluaciones = new ArrayList<Evaluacion>();
		try {
			PreparedStatement pstmt = null;
			if (categoria.equals("")) {
				pstmt = conexion
						.prepareStatement("select estudiante_Codigo,categoria,rango,puntaje,fecha from Evaluacion where fecha=? and rango=? and estudiante_Codigo  IN ( select codigo from Estudiante where nombre=? AND docente_Cedula=?  ) ");
				pstmt.setString(1, fecha);
				pstmt.setInt(2, edad);
				pstmt.setString(3, nombre);
				pstmt.setString(4, docente);
			} else {
				pstmt = conexion
						.prepareStatement("select estudiante_Codigo,categoria,rango,puntaje,fecha from Evaluacion where categoria=? and rango=? and fecha=? and estudiante_Codigo  IN ( select codigo from Estudiante where nombre=? AND docente_Cedula=? ) ");
				pstmt.setString(1, categoria);
				pstmt.setInt(2, edad);
				pstmt.setString(3, fecha);
				pstmt.setString(4, nombre);
				pstmt.setString(5, docente);
			}

			ResultSet res = pstmt.executeQuery();
			while (res.next()) {
				String codigo = res.getString(1);
				int rango = res.getInt(3);
				String categoria1 = res.getString(2);
				int puntaje = res.getInt(4);
				fecha = res.getString(5);
				Estudiante estudiante = new Estudiante(codigo, rango, nombre, "",
						null, "", "","");
				Evaluacion evaluacion = new Evaluacion("", categoria1, fecha,
						rango, puntaje, estudiante);
				evaluaciones.add(evaluacion);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return evaluaciones;
	}
	// fecha nombre
	public List<Evaluacion> evaluacionesFechaCodigo(String fecha,
			String nombre, String docente) {
		List<Evaluacion> evaluaciones = new ArrayList<Evaluacion>();
		try {

			PreparedStatement pstmt = conexion
					.prepareStatement("select estudiante_Codigo,categoria,rango,puntaje,fecha from Evaluacion where fecha=? and estudiante_Codigo  IN ( select codigo from Estudiante where nombre=? AND docente_Cedula=?  ) ");
			pstmt.setString(1, fecha);
			pstmt.setString(2,nombre);
			pstmt.setString(3, docente);
			ResultSet res = pstmt.executeQuery();
			while (res.next()) {
				String codigo = res.getString(1);
				int rango = res.getInt(3);
				String categoria = res.getString(2);
				int puntaje = res.getInt(4);
				fecha = res.getString(5);
				Estudiante estudiante = new Estudiante(codigo, rango,nombre, "",
						null, "", "","");
				Evaluacion evaluacion = new Evaluacion("", categoria, fecha,
						rango, puntaje, estudiante);
				evaluaciones.add(evaluacion);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return evaluaciones;
	}

	// categoria nombre
	public List<Evaluacion> evaluacionesCategoriaCodigo(String categoria,
			String nombre, String docente) {
		List<Evaluacion> evaluaciones = new ArrayList<Evaluacion>();
		try {

			PreparedStatement pstmt = null;
			if (categoria.equals("Todas")) {

				pstmt = conexion
						.prepareStatement("select estudiante_Codigo,categoria,rango,puntaje,fecha from Evaluacion where estudiante_Codigo IN ( select codigo from Estudiante where nombre=? AND docente_Cedula=?  ) ");
				pstmt.setString(1, nombre);
				pstmt.setString(2, docente);
			} else {
				pstmt = conexion
						.prepareStatement("select estudiante_Codigo,categoria,rango,puntaje,fecha from Evaluacion where categoria=? and estudiante_Codigo IN ( select codigo from Estudiante where nombre=? AND docente_Cedula=?  ) ");
				pstmt.setString(1, categoria);
				pstmt.setString(2,nombre);
				pstmt.setString(3, docente);
			}

			ResultSet res = pstmt.executeQuery();
			while (res.next()) {
				String codigo = res.getString(1);
				int rango = res.getInt(3);
				String categoria1 = res.getString(2);
				int puntaje = res.getInt(4);
				String fecha = res.getString(5);
				Estudiante estudiante = new Estudiante(codigo, rango,nombre, "",
						null, "", "","");
				Evaluacion evaluacion = new Evaluacion("", categoria1, fecha,
						rango, puntaje, estudiante);
				evaluaciones.add(evaluacion);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return evaluaciones;
	}

	// categoria fecha edad
	public List<Evaluacion> evaluacionesCategoriaFechaEdad(String categoria,
			String fecha, int edad, String docente) {
		List<Evaluacion> evaluaciones = new ArrayList<Evaluacion>();
		try {
			PreparedStatement pstmt = null;
			if (categoria.equals("")) {
				pstmt = conexion
						.prepareStatement("select estudiante_Codigo,categoria,rango,puntaje,fecha from Evaluacion where  fecha=? AND estudiante_Codigo IN ( select codigo from Estudiante where edad=? AND docente_Cedula=?  ) ");
				pstmt.setString(1, fecha);
				pstmt.setInt(2, edad);
				pstmt.setString(3, docente);
			} else {
				pstmt = conexion
						.prepareStatement("select estudiante_Codigo,categoria,rango,puntaje,fecha from Evaluacion where categoria=? AND fecha=? AND estudiante_Codigo IN ( select codigo from Estudiante where edad=? AND docente_Cedula=?  ) ");
				pstmt.setString(1, categoria);
				pstmt.setString(2, fecha);
				pstmt.setInt(3, edad);
				pstmt.setString(4, docente);
			}

			ResultSet res = pstmt.executeQuery();
			while (res.next()) {
				String codigo = res.getString(1);
				int rango = res.getInt(3);
				String categoria1 = res.getString(2);
				int puntaje = res.getInt(4);
				fecha = res.getString(5);
				Estudiante estudiante = new Estudiante(codigo, rango, "", "",
						null, "", "","");
				Evaluacion evaluacion = new Evaluacion("", categoria1, fecha,
						rango, puntaje, estudiante);
				evaluaciones.add(evaluacion);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return evaluaciones;
	}

	// categoria fecha
	public List<Evaluacion> evaluacionesCategoriaFecha(String categoria,
			String fecha, String docente) {
		List<Evaluacion> evaluaciones = new ArrayList<Evaluacion>();
		try {

			PreparedStatement pstmt = null;
			if (categoria.equals("Todas")) {
				pstmt = conexion
						.prepareStatement("select estudiante_Codigo,categoria,rango,puntaje,fecha from Evaluacion where fecha=? AND estudiante_Codigo IN ( select codigo from Estudiante where docente_Cedula=?  ) ");
				pstmt.setString(1, fecha);
				pstmt.setString(2, docente);
			} else {
				pstmt = conexion
						.prepareStatement("select estudiante_Codigo,categoria,rango,puntaje,fecha from Evaluacion where categoria=? and fecha=? AND estudiante_Codigo IN ( select codigo from Estudiante where docente_Cedula=?  ) ");
				pstmt.setString(1, categoria);
				pstmt.setString(2, fecha);
				pstmt.setString(3, docente);
			}

			ResultSet res = pstmt.executeQuery();
			while (res.next()) {
				String codigo = res.getString(1);
				int rango = res.getInt(3);
				String categoria1 = res.getString(2);
				int puntaje = res.getInt(4);
				fecha = res.getString(5);
				Estudiante estudiante = new Estudiante(codigo, rango, "", "",
						null, "", "","");
				Evaluacion evaluacion = new Evaluacion("", categoria1, fecha,
						rango, puntaje, estudiante);
				evaluaciones.add(evaluacion);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return evaluaciones;
	}

	// fecha edad
	public List<Evaluacion> evaluacionesFechaEdad(String fecha, int edad,
			String docente) {
		List<Evaluacion> evaluaciones = new ArrayList<Evaluacion>();
		try {
			PreparedStatement pstmt = conexion
					.prepareStatement("select estudiante_Codigo,categoria,rango,puntaje,fecha from Evaluacion where  fecha=? AND estudiante_Codigo IN ( select codigo from Estudiante where edad=? AND docente_Cedula=?  ) ");
			pstmt.setString(1, fecha);
			pstmt.setInt(2, edad);
			pstmt.setString(3, docente);
			ResultSet res = pstmt.executeQuery();
			while (res.next()) {
				String codigo = res.getString(1);
				int rango = res.getInt(3);
				String categoria = res.getString(2);
				int puntaje = res.getInt(4);
				fecha = res.getString(5);
				Estudiante estudiante = new Estudiante(codigo, rango, "", "",
						null, "", "","");
				Evaluacion evaluacion = new Evaluacion("", categoria, fecha,
						rango, puntaje, estudiante);
				evaluaciones.add(evaluacion);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return evaluaciones;
	}

	// nombre edad

	public List<Evaluacion> evaluacionesCodigoEdad(String nombre, int edad,
			String docente) {
		List<Evaluacion> evaluaciones = new ArrayList<Evaluacion>();
		try {
			PreparedStatement pstmt = conexion
					.prepareStatement("select estudiante_Codigo,categoria,rango,puntaje,fecha from Evaluacion where estudiante_Codigo  IN ( select codigo from Estudiante where nombre=? AND edad=? AND docente_Cedula=?  ) ");
			pstmt.setString(1, nombre);
			pstmt.setInt(2, edad);
			pstmt.setString(3, docente);
			ResultSet res = pstmt.executeQuery();
			while (res.next()) {
				String codigo1 = res.getString(1);
				int rango = res.getInt(3);
				String categoria1 = res.getString(2);
				int puntaje = res.getInt(4);
				String fecha = res.getString(5);
				Estudiante estudiante = new Estudiante(codigo1, rango,nombre, "",
						null, "", "","");
				Evaluacion evaluacion = new Evaluacion("", categoria1, fecha,
						rango, puntaje, estudiante);
				evaluaciones.add(evaluacion);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return evaluaciones;
	}

	// nombre edad categoria

	public List<Evaluacion> evaluacionesCategoriaEdadCodigo(String categoria,
			String nombre, int edad, String docente) {
		List<Evaluacion> evaluaciones = new ArrayList<Evaluacion>();
		try {
			PreparedStatement pstmt = null;
			if (categoria.equals("")) {
				pstmt = conexion
						.prepareStatement("select estudiante_Codigo,categoria,rango,puntaje,fecha from Evaluacion where estudiante_Codigo  IN ( select codigo from Estudiante where nombre=? AND edad=? AND docente_Cedula=?  ) ");
				pstmt.setString(1,nombre);
				pstmt.setInt(2, edad);
				pstmt.setString(3, docente);
			} else {
				pstmt = conexion
						.prepareStatement("select estudiante_Codigo,categoria,rango,puntaje,fecha from Evaluacion where categoria=? and estudiante_Codigo  IN ( select codigo from Estudiante where nombre=? AND edad=? AND docente_Cedula=?  ) ");
				pstmt.setString(1, categoria);
				pstmt.setString(2,nombre);
				pstmt.setInt(3, edad);
				pstmt.setString(4, docente);
			}

			ResultSet res = pstmt.executeQuery();
			while (res.next()) {
				String codigo1 = res.getString(1);
				int rango = res.getInt(3);
				String categoria1 = res.getString(2);
				int puntaje = res.getInt(4);
				String fecha = res.getString(5);
				Estudiante estudiante = new Estudiante(codigo1, rango,nombre, "",
						null, "", "","");
				Evaluacion evaluacion = new Evaluacion("", categoria1, fecha,
						rango, puntaje, estudiante);
				evaluaciones.add(evaluacion);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return evaluaciones;
	}

	// edad categoria

	public List<Evaluacion> evaluacionesEdadCategoria(int edad,
			String categoria, String docente) {
		List<Evaluacion> evaluaciones = new ArrayList<Evaluacion>();
		try {

			PreparedStatement pstmt = null;

			if (categoria.equals("")) {
				pstmt = conexion
						.prepareStatement("select estudiante_Codigo,categoria,rango,puntaje,fecha from Evaluacion where estudiante_Codigo  IN ( select codigo from Estudiante where edad=? AND docente_Cedula=?  ) ");
				pstmt.setInt(1, edad);
				pstmt.setString(2, docente);
			} else {
				pstmt = conexion
						.prepareStatement("select estudiante_Codigo,categoria,rango,puntaje,fecha from Evaluacion where categoria=? AND estudiante_Codigo  IN ( select codigo from Estudiante where edad=? AND docente_Cedula=?  ) ");
				pstmt.setString(1, categoria);
				pstmt.setInt(2, edad);
				pstmt.setString(3, docente);
			}

			ResultSet res = pstmt.executeQuery();
			while (res.next()) {
				String codigo1 = res.getString(1);
				int rango = res.getInt(3);
				String categoria1 = res.getString(2);
				int puntaje = res.getInt(4);
				String fecha = res.getString(5);
				Estudiante estudiante = new Estudiante(codigo1, rango, "", "",
						null, "", "","");
				Evaluacion evaluacion = new Evaluacion("", categoria1, fecha,
						rango, puntaje, estudiante);
				evaluaciones.add(evaluacion);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return evaluaciones;
	}

	// solo codigo
	public List<Evaluacion> evaluacionesCodigo(String codigo, String docente) {
		List<Evaluacion> evaluaciones = new ArrayList<Evaluacion>();
		try {
			PreparedStatement pstmt = conexion
					.prepareStatement("select estudiante_Codigo,categoria,rango,puntaje,fecha from Evaluacion where estudiante_Codigo IN ( select codigo from Estudiante where codigo=? AND docente_Cedula=?  )");
			pstmt.setString(1, codigo);
			pstmt.setString(2, docente);
			ResultSet res = pstmt.executeQuery();
			while (res.next()) {
				codigo = res.getString(1);
				int rango = res.getInt(3);
				String categoria = res.getString(2);
				int puntaje = res.getInt(4);
				String fecha = res.getString(5);
				Estudiante estudiante = new Estudiante(codigo, rango, "", "",
						null, "", "","");
				Evaluacion evaluacion = new Evaluacion("", categoria, fecha,
						rango, puntaje, estudiante);
				evaluaciones.add(evaluacion);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return evaluaciones;
	}

	// solo edad
	public List<Evaluacion> evaluacionesEdad(int edad, String docente) {
		List<Evaluacion> evaluaciones = new ArrayList<Evaluacion>();
		try {
			PreparedStatement pstmt = conexion
					.prepareStatement("select estudiante_Codigo,categoria,rango,puntaje,fecha from Evaluacion where rango=? AND estudiante_Codigo IN ( select codigo from Estudiante where  docente_Cedula=?  )");
			pstmt.setInt(1, edad);
			pstmt.setString(2, docente);
			ResultSet res = pstmt.executeQuery();
			while (res.next()) {
				String codigo = res.getString(1);
				int rango = res.getInt(3);
				String categoria = res.getString(2);
				int puntaje = res.getInt(4);
				String fecha = res.getString(5);
				Estudiante estudiante = new Estudiante(codigo, rango, "", "",
						null, "", "","");
				Evaluacion evaluacion = new Evaluacion("", categoria, fecha,
						rango, puntaje, estudiante);
				evaluaciones.add(evaluacion);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return evaluaciones;
	}

	// solo fecha
	public List<Evaluacion> evaluacionesFecha(String fecha, String docente) {
		List<Evaluacion> evaluaciones = new ArrayList<Evaluacion>();
		try {
			PreparedStatement pstmt = conexion
					.prepareStatement("select estudiante_Codigo,categoria,rango,puntaje,fecha from Evaluacion where fecha=? AND estudiante_Codigo IN ( select codigo from Estudiante where  docente_Cedula=?  )");
			pstmt.setString(1, fecha);
			pstmt.setString(2, docente);
			ResultSet res = pstmt.executeQuery();
			while (res.next()) {
				String codigo = res.getString(1);
				int rango = res.getInt(3);
				String categoria = res.getString(2);
				int puntaje = res.getInt(4);
				fecha = res.getString(5);
				Estudiante estudiante = new Estudiante(codigo, rango, "", "",
						null, "", "","");
				Evaluacion evaluacion = new Evaluacion("", categoria, fecha,
						rango, puntaje, estudiante);
				evaluaciones.add(evaluacion);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return evaluaciones;
	}

}
